/**********************************************************************************************************\
 * Copyright (c) 2006, Dan Kruchinin, <just.asgard@gmail.com>.                                            *
 * All rights reserved.                                                                                   *
 *                                                                                                        *
 * -> safe_alloc.h                                                                                        *
 *                                                                                                        *
 * Redistribution and use of this software in source and binary forms, with or without modification, are  *
 * permitted provided that the following conditions are met:                                              *
 *                                                                                                        *
 * - Redistributions of source code must retain the above                                                 *
 * copyright notice, this list of conditions and the                                                      *
 * following disclaimer.                                                                                  *
 *                                                                                                        *
 * - Redistributions in binary form must reproduce the above                                              *
 * copyright notice, this list of conditions and the                                                      *
 * following disclaimer in the documentation and/or other                                                 *
 * materials provided with the distribution.                                                              *
 *                                                                                                        *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
\**********************************************************************************************************/

#ifndef SAFE_ALLOC_H
#define SAFE_ALLOC_H

#include <stdint.h>

#ifndef MEM_DEBUG
#define smalloc(size) _safe_malloc(size)
#define scalloc(num, size) _safe_calloc(num, size)
#define srealloc(ptr, size) _safe_realloc(ptr, size)
#define sfree(ptr) _safe_free(ptr)
#else /* if MEM_DEBUG enabled, we hold full memory allocation history in application */
#define smalloc(size) _safe_malloc_dbg(size, __FILE__, __LINE__)
#define scalloc(num, size) _safe_calloc_dbg(num, size, __FILE__, __LINE__)
#define srealloc(ptr, size) _safe_realloc_dbg(ptr, size, __FILE__, __LINE__)
#define sfree(ptr) _safe_free_dbg(ptr, __FILE__, __LINE__)

struct mlist_data {
  char* file; /* file name in wich memory was [allocated|fried] */
  int line;   /* line number */
};

struct mlist {
  uintptr_t addr; /* allocated address */
  int size;       /* size of allocated block */
  struct mlist_data* allocated;
  struct mlist_data* fried;
  struct mlist* next;
};

#endif /* MEM_DEBUG */

void* _safe_malloc(size_t);
void* _safe_calloc(int, size_t);
void* _safe_realloc(void*, size_t);
void _safe_free(void*);

#ifdef MEM_DEBUG
void* _safe_malloc_dbg(size_t, const char*, const int);
void* _safe_calloc_dbg(int, size_t, const char*, const int);
void* _safe_realloc_dbg(void*, size_t, const char*, const int);
void _safe_free_dbg(void*, const char*, const int);
void _dump_memory_dbg(void);
#endif /* MEM_DEBUG */

#endif /* SAFE_ALLOC_H */
